/**
 * 获取所有地址栏参数
 */
export const getUrlAllParams = (url?: string) => {
  const result: any = {}
  url = url || window.location.href
  if (typeof url !== 'string') return result // 如果不是字符串返回空对象
  const urls = url.split('?')
  if (urls.length <= 1) return result
  url = urls[1]
  const pairs = url.split('&')
  for (const pair_ of pairs) {
    const pair = pair_.split('=')
    // application/x-www-form-urlencoded编码会将' '转换为+
    const key = decodeURIComponent(pair[0]).replaceAll('+', ' ')
    const value = decodeURIComponent(pair[1]).replaceAll('+', ' ')
    // 如果是新key，直接添加
    if (!(key in result)) {
      result[key] = value
    } else if (Array.isArray(result[key])) {
      // 如果key已经出现一次以上，直接向数组添加value
      result[key].push(value)
    } else {
      // key第二次出现，将结果改为数组
      const valueArr = [result[key]]
      valueArr.push(value)
      result[key] = valueArr
    }
  }
  return result
}

/**
 * 获取地址栏参数
 * @param name 获取对应值的名称
 * @param url 替换的url 默认为地址的href
 */
export const getUrlParams = (name: string, url?: string) => {
  url = url || window.location.href
  let result: any = new RegExp(`[?|&]${name}=([^&;]+?)(&|#|;|$)`).exec(url)
  result = result || [null, '']
  return result[1] || null
}

/**
 * 修改或者添加地址栏参数
 * @param name 要添加或者修改的名称
 * @param value 要添加或者修改的值
 * @param url 替换的url 默认为地址的href
 * @param clearEmpty 是否清除空值
 */
export const changeUrlParams = (name: string, value: string, url?: string, clearEmpty = true) => {
  url = url || window.location.href
  const reg = new RegExp(`([?|&])${name}=([^&;]+?)(&|#|;|$)`, 'i')
  const r = url.match(reg)
  const replaceText = `${name}=${value}`
  if (r === null) {
    url = url.match('[?]') ? `${url}&${replaceText}` : `${url}?${replaceText}`
  } else {
    url = url.replace(decodeURIComponent(`${name}=${r[2]}`), clearEmpty && !value ? '' : replaceText)
  }
  return url
}

/**
 * 将对象分隔成 queryStr字符串 aa=123&bb=456
 * @param query 需要拼接的参数对象
 * @param url 如果存url 拼接成完整ur返回
 * @param encode 是否encode
 */
export const stringifyQuery = (query: { [key: string]: any }, url = '', encode = true) => {
  let search = ''
  for (const k in query) {
    const key = encode ? encodeURIComponent(k) : k
    let value = ['', null, 'null', undefined, 'undefined'].includes(query[k]) ? '' : query[k]
    value = encode ? encodeURIComponent(value) : value
    search += `${search.length > 0 ? '&' : ''}${key}=${value}`
  }
  // 如果存在url拼接到url后面
  if (url) {
    url = `${url}${url.includes('?') ? '&' : '?'}${search}`
    return url
  }
  return search
}
